// 给你一个整数数组 citations ，其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
// 根据维基百科上 h 指数的定义：h 代表“高引用次数” ，
// 一名科研人员的 h 指数 是指他（她）至少发表了 h 篇论文，并且 至少 有 h 篇论文被引用次数大于等于 h 。
// 如果 h 有多种可能的值，h 指数 是其中最大的那个。
// 示例 1：

// 输入：citations = [3,0,6,1,5]
// 输出：3
// 解释：给定数组表示研究者总共有 5 篇论文，每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
//      由于研究者有 3 篇论文每篇 至少 被引用了 3 次，其余两篇论文每篇被引用 不多于 3 次，所以她的 h 指数是 3。
// 示例 2：

// 输入：citations = [1,3,1]
// 输出：1

/**
 * @param {number[]} citations
 * @return {number}
 */
const hIndex = (citations) => {
  const len = citations.length
  let hIndex = len
  let count = 0
  citations.sort((a, b) => b - a)
  console.log('citations:', citations)
  for (let j = 0; j < len; j++) {
    console.log('hIndex:', hIndex)
    for (let i = 0; i < len; i++) {
      if (citations[i] >= hIndex) {
        count++
      }
    }
    if (count >= hIndex) return hIndex
    hIndex--
    count = 0
  }
  return 0
}

// console.log('res:', hIndex([1, 3, 1]))

// 给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

// 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function (nums) {
  nums.sort((a, b) => a - b)
  console.log('nums:', nums)
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === nums[i + 1]) {
      i += 2
    } else {
      return nums[i]
    }
    if (i + 1 > nums.length) return nums[nums.length - 1]
  }
}
// console.log('res:', singleNumber([0, 1, 0, 1, 0, 1, 99]))

// 给你一个整数数组 nums ，判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ，同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

// 注意：答案中不可以包含重复的三元组。

// 示例 1：

// 输入：nums = [-1,0,1,2,-1,-4]
// 输出：[[-1,-1,2],[-1,0,1]]
// 解释：
// nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
// nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
// nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
// 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
// 注意，输出的顺序和三元组的顺序并不重要。
// 示例 2：

// 输入：nums = [0,1,1]
// 输出：[]
// 解释：唯一可能的三元组和不为 0 。
// 示例 3：

// 输入：nums = [0,0,0]
// 输出：[[0,0,0]]
// 解释：唯一可能的三元组和为 0 。

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
  const res = []
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      for (let k = j + 1; k < nums.length; k++) {
        if (nums[i] + nums[j] + nums[k] === 0) {
          res.push([nums[i], nums[j], nums[k]])
        }
      }
    }
  }
  return res
}

console.log('res:', threeSum([-1, 0, 1, 2, -1, -4]))
